#pragma once

#include "Common.h"

class ThreadCache
{
public:
    // 申请的释放内存对象
    // 类内成员不需要静态,不会有多次被包含产生同名变量的情况
    // 具体是否使用静态看编程需求
    void* Allocate(size_t size);
    void Deallocate(void*& ptr, size_t size);
    //从中心缓存获取对象
    void* FetchFromCentralCache(size_t index, size_t size);
    void ListTooLong(Freelist& list, size_t size);
private:
    Freelist _freeLists[NFREELIST];//用哈希桶去存储自由链表，每个桶存的是8，16，24...字节的自由链表
};

//无锁访问:

//TLS线程局部存储,由于普通的全局变量会被所有线程看到共享,因此采用TLS线程局部存储
//该存储方式是每个线程都有一个,可以在线程内全局访问,但是不能被其他线程给看到,保持了数据独立性
//static是只在当前文件可见,如果不用static,如果.h被多个cpp文件包含,重复生成多个名字相同的变量,会出现链接错误
#ifdef _WIN32
static _declspec(thread) ThreadCache* pTLSThreadCache = nullptr;
#endif